package com.factory.demo2.main;

import com.factory.demo2.abs.ChicagoPizzaStore;
import com.factory.demo2.abs.NYPizzaStore;
import com.factory.demo2.abs.Pizza;
import com.factory.demo2.abs.PizzaStore;

/**简单工厂模式
 * 特点：
 * 1、它是一个具体的类，非接口 抽象类。有一个重要的create()方法，利用if或者 switch创建产品并返回。
 * 2、create()方法通常是静态的，所以也称之为静态工厂。
 * 
 * 二、工厂方法模式
 * 提供一个用于创建对象的接口(工厂接口)，让其实现类(工厂实现类)决定实例化哪一个类(产品类)，并且由该实现类创建对应类的实例。
 * 特点：
 * 1、提供一个产品类的接口。产品类均要实现这个接口(也可以是abstract类，即抽象产品)。
 * 2、提供一个工厂类的接口。工厂类均要实现这个接口(即抽象工厂)。
 * 3、由工厂实现类创建产品类的实例。工厂实现类应有一个方法，用来实例化产品类。
 * 不足：
 * 1、一个实现类对应一个实现工厂，当实现类很多时就会有很多工厂。
 * 
 * 三、抽象工厂模式
 * 为创建一组相关或相互依赖的对象提供一个接口，而且无需指定他们的具体类。
 * 它与工厂方法模式的区别就在于，工厂方法模式针对的是一个产品等级结构；而抽象工厂模式则是针对的多个产品等级结构。
 * 在编程中，通常一个产品结构，表现为一个接口或者抽象类，也就是说，工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类，而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。
 * 在抽象工厂模式中，有一个产品族的概念：所谓的产品族，是指位于不同产品等级结构中功能相关联的产品组成的家族。抽象工厂模式所提供的一系列产品就组成一个产品族；而工厂方法提供的一系列产品称为一个等级结构。
 * 
 * @author Ziroom
 *
 */
public class PizzaTestDrive {

	public static void main(String[] args) {
		PizzaStore nyStore = new NYPizzaStore();
		PizzaStore chicagoStore = new ChicagoPizzaStore();

		Pizza pizza = nyStore.orderPizza("cheese");
		System.out.println("Ethan ordered a " + pizza + "\n");

		pizza = chicagoStore.orderPizza("cheese");
		System.out.println("Joel ordered a " + pizza + "\n");

		pizza = nyStore.orderPizza("clam");
		System.out.println("Ethan ordered a " + pizza + "\n");

		pizza = chicagoStore.orderPizza("clam");
		System.out.println("Joel ordered a " + pizza + "\n");

		pizza = nyStore.orderPizza("veggie");
		System.out.println("Ethan ordered a " + pizza + "\n");

		pizza = chicagoStore.orderPizza("veggie");
		System.out.println("Joel ordered a " + pizza + "\n");
	}
}
